home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-01-12 | 20.9 KB | 669 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // Sprite Stuff.c
- ///--------------------------------------------------------------------------------------
-
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
- #include "SWApplication.h"
-
- #include "Split-Screen Demo.h"
- #include "Sprite Stuff.h"
-
-
- // Pointers to the original sprites which we clone
- // when we want to add a sprite to the animation.
- // We never add these sprites themselves to the animation.
-
- SpritePtr gMasterTank1SpriteP,
- gMasterTank2SpriteP,
- gMasterBulletSpriteP,
- gMasterGunPowerUpSpriteP;
-
-
- extern WindowPtr gWindowP;
- extern SpriteWorldPtr gMasterSpriteWorldP, gCloneSpriteWorldP;
- extern SpriteLayerPtr gTankSpriteLayerP, gBulletSpriteLayerP, gPowerUpSpriteLayerP;
- extern TileMapStructPtr gTileMapStructP;
- extern TileMapPtr gTileMap;
- extern Rect gMasterRect, gCloneRect;
- extern Rect gMoveBoundsRect;
- extern DrawProcPtr gSpriteMaskDrawProc;
- extern RgnHandle gTempRgn; // Used by TankHitDrawProc
-
- extern KeyStruct gTank1Keys, gTank2Keys;
-
-
- ///--------------------------------------------------------------------------------------
- // LoadSprites
- ///--------------------------------------------------------------------------------------
-
- void LoadSprites( void )
- {
- OSErr err;
-
- // Load gMasterTank1SpriteP
- err = SWCreateSpriteFromSinglePictXY(gMasterSpriteWorldP, &gMasterTank1SpriteP,
- NULL, 128, 128, 50, 50, 0, 0, 18, kFatMask);
- SetUpSprite(gMasterTank1SpriteP, err);
-
- // Load gMasterTank2SpriteP
- err = SWCreateSpriteFromSinglePictXY(gMasterSpriteWorldP, &gMasterTank2SpriteP,
- NULL, 129, 129, 50, 50, 0, 0, 18, kFatMask);
- SetUpSprite(gMasterTank2SpriteP, err);
-
- // Load gMasterBulletSpriteP
- err = SWCreateSpriteFromCicnResource(gMasterSpriteWorldP, &gMasterBulletSpriteP,
- NULL, 128, 1, kFatMask);
- SetUpSprite(gMasterBulletSpriteP, err);
- SWSetFrameHotSpot(gMasterBulletSpriteP->curFrameP, kHalfBulletSize, kHalfBulletSize);
-
- // Load gMasterGunPowerUpSpriteP
- err = SWCreateSpriteFromCicnResource(gMasterSpriteWorldP, &gMasterGunPowerUpSpriteP,
- NULL, 130, 1, kFatMask);
- SetUpSprite(gMasterGunPowerUpSpriteP, err);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // DisposeSprites - we must dispose of each sprite we loaded, since they are not
- // added to the SpriteWorld, and therefore will not be disposed with the SpriteWorld.
- ///--------------------------------------------------------------------------------------
-
- void DisposeSprites( void )
- {
- SWDisposeSprite(&gMasterTank1SpriteP);
- SWDisposeSprite(&gMasterTank2SpriteP);
- SWDisposeSprite(&gMasterBulletSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpSprite - makes the LoadSprites code a little cleaner.
- ///--------------------------------------------------------------------------------------
-
- void SetUpSprite(SpritePtr mySpriteP, OSErr err)
- {
- FatalError(err);
-
- if (gMasterSpriteWorldP->pixelDepth == 8)
- SWCompileSprite(mySpriteP);
-
- SWSetSpriteMoveBounds(mySpriteP, &gMasterSpriteWorldP->scrollRectMoveBounds);
- SWSetSpriteDrawProc(mySpriteP, gSpriteMaskDrawProc);
- SWLockSprite(mySpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // NewTankSprite - clone the master sprite and add the clone to the animation.
- // Also allocate memory for the custom sprite structure.
- ///--------------------------------------------------------------------------------------
-
- SpritePtr NewTankSprite( short tankType )
- {
- TankStructPtr tankStructP;
- SpritePtr tankSpriteP;
- OSErr err;
-
- // Allocate memory for the TankStruct
- tankStructP = (TankStructPtr)NewPtr(sizeof(TankStruct));
- FatalError( MemError() );
-
- if (tankType == kPlayer1)
- err = SWCloneSprite(gMasterTank1SpriteP, &tankSpriteP, tankStructP);
- else
- err = SWCloneSprite(gMasterTank2SpriteP, &tankSpriteP, tankStructP);
- FatalError(err);
-
- SWAddSprite(gTankSpriteLayerP, tankSpriteP);
- SWSetSpriteMoveProc(tankSpriteP, TankSpriteMoveProc);
-
- if (tankType == kPlayer1)
- SWSetCurrentFrameIndex(tankSpriteP, kTankRightFrameIndex);
- else
- SWSetCurrentFrameIndex(tankSpriteP, kTankLeftFrameIndex);
-
- tankStructP->tankType = tankType;
- tankStructP->numBulletsOnScreen = 0;
- tankStructP->nextShotDelay = 0;
- tankStructP->gunType = kNormalGun;
- tankStructP->damage = 0;
- tankStructP->canShoot = true;
- tankStructP->wasHit = false;
- SW_SET_RECT(tankStructP->insetRect, 10, 10, 10, 10);
-
- return tankSpriteP;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // NewBulletSprite - clone the master sprite and add the clone to the animation.
- // Also allocate memory for the custom sprite structure.
- ///--------------------------------------------------------------------------------------
-
- SpritePtr NewBulletSprite( void )
- {
- BulletStructPtr bulletStructP;
- SpritePtr bulletSpriteP;
- OSErr err;
-
- // Allocate memory for the BulletStruct
- bulletStructP = (BulletStructPtr)NewPtr(sizeof(BulletStruct));
- FatalError( MemError() );
-
- err = SWCloneSprite(gMasterBulletSpriteP, &bulletSpriteP, bulletStructP);
- FatalError(err);
-
- SWAddSprite(gBulletSpriteLayerP, bulletSpriteP);
- SWSetSpriteMoveProc(bulletSpriteP, BulletSpriteMoveProc);
- SWSetSpriteCollideProc(bulletSpriteP, BulletSpriteCollideProc);
-
- bulletStructP->numMovesLeft = 30;
-
- return bulletSpriteP;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // NewPowerUpSprite - clone the master sprite and add the clone to the animation.
- ///--------------------------------------------------------------------------------------
-
- SpritePtr NewPowerUpSprite( GunType gunType )
- {
- SpritePtr powerUpSpriteP;
- OSErr err;
-
- err = SWCloneSprite(gMasterGunPowerUpSpriteP, &powerUpSpriteP, NULL);
- FatalError(err);
-
- SWAddSprite(gPowerUpSpriteLayerP, powerUpSpriteP);
- SWSetSpriteCollideProc(powerUpSpriteP, PowerUpCollideProc);
-
- powerUpSpriteP->userData = gunType;
-
- return powerUpSpriteP;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // TankSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void TankSpriteMoveProc(SpritePtr tankSpriteP)
- {
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
- TankDirectionType currentDirection;
- KeyStruct *tankKeysP;
-
- // Determine whether to use keys for player 1 or player 2
- if (tankStructP->tankType == kPlayer1)
- tankKeysP = &gTank1Keys;
- else
- tankKeysP = &gTank2Keys;
-
-
- // If the tank was just hit and flashed white, change back to normal drawProc
- if (tankStructP->wasHit)
- {
- tankStructP->wasHit = false;
- tankSpriteP->needsToBeDrawn = true;
- SWSetSpriteDrawProc(tankSpriteP, gSpriteMaskDrawProc);
- }
-
-
- // Figure out which direction we're going
- if (tankKeysP->up)
- {
- if (tankKeysP->right)
- currentDirection = kTankUpRightFrameIndex;
- else if (tankKeysP->left)
- currentDirection = kTankUpLeftFrameIndex;
- else
- currentDirection = kTankUpFrameIndex;
- }
- else if (tankKeysP->down)
- {
- if (tankKeysP->right)
- currentDirection = kTankDownRightFrameIndex;
- else if (tankKeysP->left)
- currentDirection = kTankDownLeftFrameIndex;
- else
- currentDirection = kTankDownFrameIndex;
- }
- else
- {
- if (tankKeysP->right)
- currentDirection = kTankRightFrameIndex;
- else if (tankKeysP->left)
- currentDirection = kTankLeftFrameIndex;
- else
- currentDirection = kNoDirection;
- }
-
-
- // Set the current frame index, and store current direction
- if (currentDirection != kNoDirection)
- {
- SWSetCurrentFrameIndex(tankSpriteP, currentDirection);
- }
-
-
- // Move the tank
- switch (currentDirection)
- {
- case kTankUpFrameIndex:
- tankSpriteP->horizMoveDelta = 0;
- tankSpriteP->vertMoveDelta = -kTankSpeed;
- break;
- case kTankUpRightFrameIndex:
- tankSpriteP->horizMoveDelta = kTankSpeed/1.5;
- tankSpriteP->vertMoveDelta = -kTankSpeed/1.5;
- break;
- case kTankRightFrameIndex:
- tankSpriteP->horizMoveDelta = kTankSpeed;
- tankSpriteP->vertMoveDelta = 0;
- break;
- case kTankDownRightFrameIndex:
- tankSpriteP->horizMoveDelta = kTankSpeed/1.5;
- tankSpriteP->vertMoveDelta = kTankSpeed/1.5;
- break;
- case kTankDownFrameIndex:
- tankSpriteP->horizMoveDelta = 0;
- tankSpriteP->vertMoveDelta = kTankSpeed;
- break;
- case kTankDownLeftFrameIndex:
- tankSpriteP->horizMoveDelta = -kTankSpeed/1.5;
- tankSpriteP->vertMoveDelta = kTankSpeed/1.5;
- break;
- case kTankLeftFrameIndex:
- tankSpriteP->horizMoveDelta = -kTankSpeed;
- tankSpriteP->vertMoveDelta = 0;
- break;
- case kTankUpLeftFrameIndex:
- tankSpriteP->horizMoveDelta = -kTankSpeed/1.5;
- tankSpriteP->vertMoveDelta = -kTankSpeed/1.5;
- break;
- default:
- tankSpriteP->horizMoveDelta = 0;
- tankSpriteP->vertMoveDelta = 0;
- break;
- }
-
-
- // Slow the tank down if it is in contact with mud
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWEntireSprite,
- &tankStructP->insetRect, 0, 0, kMudTile, kMudTile, false) )
- {
- tankSpriteP->horizMoveDelta /= 2;
- tankSpriteP->vertMoveDelta /= 2;
- }
-
-
- tankSpriteP->destFrameRect.top += tankSpriteP->vertMoveDelta;
- tankSpriteP->destFrameRect.bottom += tankSpriteP->vertMoveDelta;
-
-
- // Check for collisions with walls vertically
- if (tankSpriteP->vertMoveDelta > 0) // Moving down
- {
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWBottomSide,
- &tankStructP->insetRect, 0, 0, kFirstWallTile, kLastWallTile, true) )
- {
- tankSpriteP->vertMoveDelta = 0;
- }
- }
- else if (tankSpriteP->vertMoveDelta < 0) // Moving up
- {
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWTopSide,
- &tankStructP->insetRect, 0, 0, kFirstWallTile, kLastWallTile, true) )
- {
- tankSpriteP->vertMoveDelta = 0;
- }
- }
-
-
- tankSpriteP->destFrameRect.right += tankSpriteP->horizMoveDelta;
- tankSpriteP->destFrameRect.left += tankSpriteP->horizMoveDelta;
-
- // Check for collisions with walls horizontally
- if (tankSpriteP->horizMoveDelta > 0) // Moving right
- {
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWRightSide,
- &tankStructP->insetRect, 0, 0, kFirstWallTile, kLastWallTile, true) )
- {
- tankSpriteP->horizMoveDelta = 0;
- }
- }
- else if (tankSpriteP->horizMoveDelta < 0) // Moving left
- {
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWLeftSide,
- &tankStructP->insetRect, 0, 0, kFirstWallTile, kLastWallTile, true) )
- {
- tankSpriteP->horizMoveDelta = 0;
- }
- }
-
- // Damage the tank if it hits lava
- if ( SWCheckSpriteWithTiles(gMasterSpriteWorldP, tankSpriteP, kSWEntireSprite,
- &tankStructP->insetRect, 0, 0, kFirstLavaTile, kFirstLavaTile, false) )
- {
- DamageTank(tankSpriteP, 4);
- }
-
-
- tankSpriteP->needsToBeDrawn = true;
-
-
- if (tankKeysP->shoot)
- {
- if (tankStructP->canShoot)
- {
- tankStructP->canShoot = false;
-
- if ( (tankStructP->numBulletsOnScreen < kMaxNumBullets) || tankStructP->gunType == kMachineGun)
- ShootBullet(tankSpriteP);
- }
- else if (tankStructP->gunType == kMachineGun)
- {
- tankStructP->nextShotDelay++;
- if (tankStructP->nextShotDelay >= kNextShotDelay)
- {
- tankStructP->nextShotDelay = 0;
- tankStructP->canShoot = true;
- }
- }
- }
- else if (tankStructP->gunType == kMachineGun && tankStructP->canShoot == false)
- {
- tankStructP->nextShotDelay++;
- if (tankStructP->nextShotDelay >= kNextShotDelay)
- {
- tankStructP->nextShotDelay = 0;
- tankStructP->canShoot = true;
- }
- }
- else
- {
- tankStructP->canShoot = true;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BulletSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BulletSpriteMoveProc(SpritePtr bulletSpriteP)
- {
- BulletStructPtr bulletStructP = (BulletStructPtr)bulletSpriteP;
- short tileRow, tileCol, tileID;
-
- // Don't move the sprite if it was just now created
- // and hasn't even been drawn yet.
- if (bulletSpriteP->needsToBeDrawn)
- return;
-
-
- tileID = SWReturnTileUnderPixel(gMasterSpriteWorldP, 0,
- bulletSpriteP->destFrameRect.left + kHalfBulletSize,
- bulletSpriteP->destFrameRect.top + kHalfBulletSize);
-
- if ( tileID >= kFirstWallTile && tileID <= kLastWallTile )
- {
- // Remove the bullet - it hit a wall
- bulletStructP->parentStructP->numBulletsOnScreen--;
- SWRemoveSpriteFromAnimation(gMasterSpriteWorldP, bulletSpriteP, true);
-
- // Convert pixel coordinates to tileMap coordinates
- tileRow = (bulletSpriteP->destFrameRect.top + kHalfBulletSize) / kTileHeight;
- tileCol = (bulletSpriteP->destFrameRect.left + kHalfBulletSize) / kTileWidth;
-
- // Damage the wall
- tileID += kWallDamageOffset;
- if (tileID > kLastWallTile)
- tileID = kMainFloorTile;
-
- // Change the tile in *both* SpriteWorlds.
- SWDrawTile(gMasterSpriteWorldP, 0, tileRow, tileCol, tileID);
- SWDrawTile(gCloneSpriteWorldP, 0, tileRow, tileCol, tileID);
- }
- else if (bulletStructP->numMovesLeft-- <= 0)
- {
- // Remove the bullet - it has moved past its range
- bulletStructP->parentStructP->numBulletsOnScreen--;
- SWRemoveSpriteFromAnimation(gMasterSpriteWorldP, bulletSpriteP, true);
- }
-
- SWOffsetSprite(bulletSpriteP, bulletSpriteP->horizMoveDelta, bulletSpriteP->vertMoveDelta);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // DeadTankFrameProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void DeadTankFrameProc(SpritePtr tankSpriteP, FramePtr curFrameP, long *frameIndex)
- {
- #pragma unused(curFrameP) // Let CodeWarrior know this variable is unused
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
-
- if (*frameIndex < kLastTankBlowUpFrame)
- *frameIndex++;
- else
- {
- // Make the tank as good as new
- SWSetCurrentFrameIndex(tankSpriteP, kTankRightFrameIndex);
- tankStructP->gunType = kNormalGun;
- tankStructP->damage = 0;
- tankStructP->wasHit = false;
- SWSetSpriteDrawProc(tankSpriteP, gSpriteMaskDrawProc);
- SWSetSpriteFrameProc(tankSpriteP, NULL);
- SWSetSpriteFrameTime(tankSpriteP, -1);
- SWSetSpriteMoveProc(tankSpriteP, TankSpriteMoveProc);
-
- if (tankStructP->tankType == kPlayer1)
- SWMoveSprite(tankSpriteP, gMoveBoundsRect.left + 120, gMoveBoundsRect.top + 100);
- else
- SWMoveSprite(tankSpriteP, gMoveBoundsRect.right-140, gMoveBoundsRect.bottom-140);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShootBullet
- ///--------------------------------------------------------------------------------------
-
- void ShootBullet(SpritePtr tankSpriteP)
- {
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
- SpritePtr newBulletSpriteP;
-
- newBulletSpriteP = NewBulletSprite();
- ((BulletStructPtr)newBulletSpriteP)->parentStructP = tankStructP;
- tankStructP->numBulletsOnScreen++;
-
- SWSetSpriteLocation(newBulletSpriteP,
- tankSpriteP->destFrameRect.left + kHalfTankWidth,
- tankSpriteP->destFrameRect.top + kHalfTankHeight);
-
- switch (tankSpriteP->curFrameIndex)
- {
- case kTankUpFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, 0, -kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, 0, -kHalfTankHeight-5);
- break;
- case kTankUpRightFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, kBulletSpeed, -kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, kHalfTankWidth+5, -kHalfTankHeight-5);
- break;
- case kTankRightFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, kBulletSpeed, 0);
- SWOffsetSprite(newBulletSpriteP, kHalfTankWidth+5, 0);
- break;
- case kTankDownRightFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, kBulletSpeed, kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, kHalfTankWidth+5, kHalfTankHeight+5);
- break;
- case kTankDownFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, 0, kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, 0, kHalfTankHeight+5);
- break;
- case kTankDownLeftFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, -kBulletSpeed, kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, -kHalfTankWidth-5, kHalfTankHeight+5);
- break;
- case kTankLeftFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, -kBulletSpeed, 0);
- SWOffsetSprite(newBulletSpriteP, -kHalfTankWidth-5, 0);
- break;
- case kTankUpLeftFrameIndex:
- SWSetSpriteMoveDelta(newBulletSpriteP, -kBulletSpeed, -kBulletSpeed);
- SWOffsetSprite(newBulletSpriteP, -kHalfTankWidth-5, -kHalfTankHeight-5);
- break;
- default:
- break;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BulletSpriteCollideProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BulletSpriteCollideProc(
- SpritePtr bulletSpriteP,
- SpritePtr tankSpriteP,
- Rect* sectRect)
- {
- #pragma unused(sectRect) // Let CodeWarrior know this variable is unused
- Boolean hasCollided;
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
-
- // Exit if the tank is in the process of being blown up
- if (tankStructP->damage > kMaximumDamage)
- return;
-
- // See if the actual sprite images collided
- if (gMasterSpriteWorldP->pixelDepth == 8)
- hasCollided = SWPixelCollision(bulletSpriteP, tankSpriteP); // Faster, but 8-bit only
- else
- hasCollided = SWRegionCollision(bulletSpriteP, tankSpriteP); // Works in any depth
-
- if (hasCollided)
- {
- // Remove the bullet
- ((BulletStructPtr)bulletSpriteP)->parentStructP->numBulletsOnScreen--;
- SWRemoveSpriteFromAnimation(gMasterSpriteWorldP, bulletSpriteP, true);
-
- DamageTank(tankSpriteP, 10);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // PowerUpCollideProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void PowerUpCollideProc(
- SpritePtr powerUpSpriteP,
- SpritePtr tankSpriteP,
- Rect* sectRect)
- {
- #pragma unused(sectRect) // Let CodeWarrior know this variable is unused
- Boolean hasCollided;
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
-
-
- // See if the actual sprite images collided
- if (gMasterSpriteWorldP->pixelDepth == 8)
- hasCollided = SWPixelCollision(powerUpSpriteP, tankSpriteP); // Faster, but 8-bit only
- else
- hasCollided = SWRegionCollision(powerUpSpriteP, tankSpriteP); // Works in any depth
-
- if (hasCollided)
- {
- // Pick it up only if we don't already have it
- if (tankStructP->gunType != powerUpSpriteP->userData)
- {
- tankStructP->gunType = powerUpSpriteP->userData;
-
- // Remove the power-up Sprite
- SWRemoveSpriteFromAnimation(gMasterSpriteWorldP, powerUpSpriteP, true);
- }
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // DamageTank
- ///--------------------------------------------------------------------------------------
-
- void DamageTank( SpritePtr tankSpriteP, short damageAmount )
- {
- TankStructPtr tankStructP = (TankStructPtr)tankSpriteP;
-
- // Increase the tank's damage
- tankStructP->damage += damageAmount;
- if (tankStructP->damage > kMaximumDamage)
- {
- // Kill the tank
- SWSetSpriteMoveProc(tankSpriteP, NULL); // A dead tank can't move.
- SWSetSpriteFrameProc(tankSpriteP, DeadTankFrameProc); // Blow it up!
- SWSetSpriteFrameTime(tankSpriteP, 1000/10); // Show animation at 10fps
- // SWSetCurrentFrameIndex(tankSpriteP, kFirstTankBlowUpFrame-1);
- }
- else
- {
- // Make the tank flash yellow
- tankStructP->wasHit = true;
- tankSpriteP->needsToBeDrawn = true;
- SWSetSpriteDrawProc(tankSpriteP, TankHitDrawProc);
- }
- }
-
-
-
- ///--------------------------------------------------------------------------------------
- // TankHitDrawProc - Note: this DrawProc requires the sprite to have a maskRgn. If you
- // look at NewSprite(), you'll see that the tank sprite was loaded with kFatMask,
- // instead of kPixelMask, so this drawProc could be used.
- //
- // Note also that since PaintRgn gives us no option to clip our drawing to the dstRect,
- // we turn the dstRect into a region and "clip" the frame's region to the dstRect
- // region with SectRgn. An alternative would be to call ClipRect to set the current
- // clipping region to dstRect before making the call to PaintRgn. (Remembering to
- // restore the old clipping region when done). This clipping must be done because
- // sometimes (especially in scrolling games) only part of a sprite needs to be drawn,
- // and drawing outside the dstRect could cause problems.
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void TankHitDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- #pragma unused(dstFrameP) // Let CodeWarrior know this variable is unused
-
- if (srcFrameP->maskRgn != NULL)
- {
- Rect rgnRect = (**srcFrameP->maskRgn).rgnBBox;
-
- // move the mask region to the sprite location
- OffsetRgn(srcFrameP->maskRgn,
- (dstRect->left - (srcRect->left - srcFrameP->frameRect.left) - rgnRect.left)
- + srcFrameP->offsetPoint.h,
- (dstRect->top - (srcRect->top - srcFrameP->frameRect.top) - rgnRect.top)
- + srcFrameP->offsetPoint.v);
-
- // Here we "clip" the srcFrameP->maskRgn with the dstRect.
- RectRgn(gTempRgn, dstRect);
- SectRgn(gTempRgn, srcFrameP->maskRgn, gTempRgn);
-
- ForeColor(yellowColor);
- PaintRgn(gTempRgn);
- ForeColor(blackColor);
- }
- }
-
-